package com.cy.pj.module.controller;

import com.cy.pj.module.pojo.ResponseResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Controller
 * @ResponseBody表示不再将响应结果理解为view,
 * 将响应结果转换为json格式(前提是必须满足转换json格式数据条件)
 * 写到响应体，响应到客户端
 *
 * {
 *      code: 406,
 *      message: "File Not Found!"
 * }
 *
 * JSON描述的是一种数据格式
 *
 * 如果一个类的所有方法都是返回JSON，可以在类上添加@Controller和@ResponseBody、或者@RestController
 * 否则，还是要用@Controller,并把@ResponseBody添加在相应的方法上
 */
@RestController
public class JsonObjectController {
    // localhost/doConvertResponseToJson
    @RequestMapping("/doConvertResponseToJson")
    public ResponseResult doConvertResponseToJson() {
        System.out.println("JsonObjectController.doConvertResponseToJson");
        ResponseResult rr = new ResponseResult();
        rr.setCode(406);
        rr.setMessage("File Not Found!");
        return rr;
        /*
         * 当此对象在返回时候，spring web模块会调用jackson api,
         * 将返回值转换为json格式
         *
         * json三剑客：jackson、gson、fastjson
         *
         * 底层转换原理：pojo中的get方法中，get单词后面的名字作为key(首字母小写)，
         *  ---- 注意key不是拿pojo对象的属性作为key ----
         * 测试 public getState(){return code;}
         * value为get方法的返回值
         */
    }

    @RequestMapping("/doConvertMapToJson")
    public Map<String, Object> doConvertMapToJson() {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 100);
        map.put("State", "操作失败！您访问的数据不存在");
        return map;
    }

    @RequestMapping("/doConvertListToJson")
    public List<Map<String, Object>> doConvertListToJson() {
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("code", "OK");
        list.add(map);
        map = new HashMap<>();
        map.put("name", "李四");
        map.put("code", "ERROR");
        list.add(map);
        return list;
    }

    @RequestMapping("/doPrint")
    public void doPrint(HttpServletResponse response) throws Exception {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 202);
        map.put("status", "此文件已被删除");
        ObjectMapper om = new ObjectMapper();
        String jsonStr = om.writeValueAsString(map);
        System.out.println(jsonStr);
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println(jsonStr);// 输出到客户端
    }
}
